<!DOCTYPE html>



  


<html class="theme-next mist use-motion" lang="zh-CN">
<head><meta name="generator" content="Hexo 3.8.0">
  <meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="theme-color" content="#222">









<meta http-equiv="Cache-Control" content="no-transform">
<meta http-equiv="Cache-Control" content="no-siteapp">
















  
  
  <link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css">







<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css">

<link href="/css/main.css?v=5.1.4" rel="stylesheet" type="text/css">


  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png?v=5.1.4">


  <link rel="mask-icon" href="/images/logo.svg?v=5.1.4" color="#222">





  <meta name="keywords" content="Hexo, NexT">










<meta name="description" content="C/C++基础开发知识总结">
<meta property="og:type" content="article">
<meta property="og:title" content="C&#x2F;C++编程基础部分常见问题梳理">
<meta property="og:url" content="http://luqilinok.github.io/2019/06/30/cpluscplusbase/index.html">
<meta property="og:site_name" content="Lu QiLin&#39;s Blog">
<meta property="og:description" content="C/C++基础开发知识总结">
<meta property="og:locale" content="zh-CN">
<meta property="og:updated_time" content="2019-06-30T12:39:04.273Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="C&#x2F;C++编程基础部分常见问题梳理">
<meta name="twitter:description" content="C/C++基础开发知识总结">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Mist',
    version: '5.1.4',
    sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: true,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    duoshuo: {
      userId: '0',
      author: 'Author'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="http://luqilinok.github.io/2019/06/30/cpluscplusbase/">





  <title>C/C++编程基础部分常见问题梳理 | Lu QiLin's Blog</title>
  








</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-CN">

  
  
    
  

  <div class="container sidebar-position-left page-post-detail">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/" class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">Lu QiLin's Blog</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle"></p>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br>
            
            Home
          </a>
        </li>
      
        
        <li class="menu-item menu-item-technology">
          <a href="/categories/Technology/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br>
            
            Technology
          </a>
        </li>
      
        
        <li class="menu-item menu-item-notes">
          <a href="/categories/Notes/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br>
            
            Notes
          </a>
        </li>
      
        
        <li class="menu-item menu-item-personal">
          <a href="/categories/Personal/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br>
            
            Personal
          </a>
        </li>
      
        
        <li class="menu-item menu-item-about">
          <a href="/about/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br>
            
            About
          </a>
        </li>
      

      
    </ul>
  

  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://luqilinok.github.io/2019/06/30/cpluscplusbase/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="LuQiLin">
      <meta itemprop="description" content>
      <meta itemprop="image" content="/images/avatar.gif">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="Lu QiLin's Blog">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">C/C++编程基础部分常见问题梳理</h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              
              <time title="Post created" itemprop="dateCreated datePublished" datetime="2019-06-30T08:29:38+08:00">
                2019-06-30
              </time>
            

            

            
          </span>
          
  <span class="post-updated">
    &nbsp; | &nbsp; 更新于
    <time itemprop="dateUpdated" datetime="2019-06-30T20:39:04+08:00" content="2019-06-30">
      2019-06-30
    </time>
  </span>

          
            <span class="post-category">
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/Notes/" itemprop="url" rel="index">
                    <span itemprop="name">Notes</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <p>C/C++基础开发知识总结</p>
<a id="more"></a>
<h1 id="基础部分"><a href="#基础部分" class="headerlink" title="基础部分"></a>基础部分</h1><h2 id="1-变量声明和定义有什么不同？"><a href="#1-变量声明和定义有什么不同？" class="headerlink" title="1.变量声明和定义有什么不同？"></a>1.变量声明和定义有什么不同？</h2><p>（1）声明仅仅是将变量的名字和内容告诉编译器，并不分配存储空间。例如：extern int a；</p>
<p>（2）定义则会为变量分配存储空间，也可能会为变量赋一个初始值。例如：int a; int pi=3.14  //声明并定义;</p>
<p>（3）变量能且只能被定义一次，但可以被多次声明;</p>
<p>（4）另外：extern double pi=3.14,此时对extern变量赋予初值，就变成定义了。</p>
<hr>
<h2 id="2-零值比较？"><a href="#2-零值比较？" class="headerlink" title="2.零值比较？"></a>2.零值比较？</h2><p>（1）bool类型：if（flag）</p>
<p>（2）int类型：if（flag==0）</p>
<p>（3）指针类型：if（flag==null）</p>
<p>（4）float类型：if（（flag&gt;=-0.000001）&amp;&amp;(flag&lt;=0.000001)）</p>
<hr>
<h2 id="3-strlen和sizeof的区别？"><a href="#3-strlen和sizeof的区别？" class="headerlink" title="3.strlen和sizeof的区别？"></a>3.strlen和sizeof的区别？</h2><p>1.sizeof是运算符，并不是函数，它的结果是在编译而非运行时获得的，strlen是字符处理的库函数；</p>
<p>2.sizeof参数可以是任何数据的类型或者结构（sizeof参数不退化）；strlen的参数只能是字符指针并且结尾是’\0’的字符串。</p>
<hr>
<h2 id="4-相同类的同一对象可以相互赋值吗？"><a href="#4-相同类的同一对象可以相互赋值吗？" class="headerlink" title="4.相同类的同一对象可以相互赋值吗？"></a>4.相同类的同一对象可以相互赋值吗？</h2><p>1.可以，但是要对含有指针成员时需注意；</p>
<p>2.深拷贝和浅拷贝的区别：浅拷贝只是增加了一个指向相同内存的指针，而深拷贝则是重新申请了一块内存，并将原来内存的值拷贝过来，使得拷贝的指针指向新的内存的指针。</p>
<hr>
<h2 id="5-结构体内存对齐问题？"><a href="#5-结构体内存对齐问题？" class="headerlink" title="5.结构体内存对齐问题？"></a>5.结构体内存对齐问题？</h2><p>1.结构体内成员按照声明顺序存储，第一个成员地址和整个结构体地址相同；</p>
<p>2.未特殊说明时，按照结构体size最大的成员对其（若有double成员），按照8字节对齐。</p>
<hr>
<h2 id="6-struct和class的区别？"><a href="#6-struct和class的区别？" class="headerlink" title="6.struct和class的区别？"></a>6.struct和class的区别？</h2><p>1.struct默认访问修饰符是public，class默认访问修饰符是private。</p>
<hr>
<h2 id="7-malloc和new的区别？"><a href="#7-malloc和new的区别？" class="headerlink" title="7.malloc和new的区别？"></a>7.malloc和new的区别？</h2><p>1.malloc和free是标准库函数；支持覆盖；new和delete是运算符，并且支持重载；</p>
<p>2.malloc仅仅分配内存空间，free仅仅回收内存空间，不具备调用构造函数和析构函数的功能，用malloc函数分配存储类的对象存在风险；new和delete除了分配回收功能之外，还能调用构造函数和析构函数；</p>
<p>3.malloc返回的是void类型的指针，必须进行类型转换，而new和delete返回的是具体类型指针。</p>
<hr>
<h2 id="8-指针和引用的区别？"><a href="#8-指针和引用的区别？" class="headerlink" title="8.指针和引用的区别？"></a>8.指针和引用的区别？</h2><p>1.引用只是别名，并不占用具体内存空间，只有声明而没有定义；指针是具体变量，需要占用存储空间；</p>
<p>2.引用一旦初始化之后就不可以再改变（变量可以被引用多次，但引用只能作为一个变量引用）；指针变量可以重新定向；</p>
<p>3.不存在引用的引用，引用必须是实体；而存在指针的指针。</p>
<hr>
<h2 id="9-宏定义和函数的区别？"><a href="#9-宏定义和函数的区别？" class="headerlink" title="9.宏定义和函数的区别？"></a>9.宏定义和函数的区别？</h2><p>1.宏定义实在编译时完成替换，之后被替换的文本参与编译，相当于直接插入了代码，运行时不存在函数调用，执行起来更快；函数调用运行时需要跳转到具体函数。</p>
<p>2.宏函数属于在结构体中插入代码，没有返回值；函数调用具有返回值；</p>
<p>3.宏函数参数没有类型，不进行类型检查；函数参数有具体类型，需要类型检查；</p>
<p>4.宏函数不要在后面加分号。</p>
<hr>
<h2 id="10-define和const的区别？"><a href="#10-define和const的区别？" class="headerlink" title="10.define和const的区别？"></a>10.define和const的区别？</h2><p>1.宏替换发生在编译预处理时，属于文本插入；const作用发生于编译过程中；</p>
<p>2.宏不检查类型；const会做类型安全检查；</p>
<p>3.宏定义的数据没有分配空间，只是简单的替换；const定义的变量不能改变，但是要分配空间。</p>
<hr>
<h2 id="11-宏定义和typedef的区别？"><a href="#11-宏定义和typedef的区别？" class="headerlink" title="11.宏定义和typedef的区别？"></a>11.宏定义和typedef的区别？</h2><p>1.宏定义主要用来定义常量和书写复杂且重复的内容；typedef主要用于定义类型别名；</p>
<p>2.宏替换发生在编译预处理阶段，属于文本插入替换；typedef是编译的一部分；</p>
<p>3.宏不检查类型；typedef会检查数据类型；</p>
<p>4.宏不是语句，后面不需要加分号；typedef是语句，要加分号标识结束。</p>
<hr>
<h2 id="12-宏定义和内联函数（inline）的区别？"><a href="#12-宏定义和内联函数（inline）的区别？" class="headerlink" title="12.宏定义和内联函数（inline）的区别？"></a>12.宏定义和内联函数（inline）的区别？</h2><p>1.在使用时，宏只是简单字符串替换（编译预处理）；而内联函数可以进行参数类型检查（编译时），且具有返回值；</p>
<p>2.内联函数本身就是函数，强调函数特性，且具有重载等功能；</p>
<p>3.内联函数可以作为某个类的成员函数，这样可以使用类的保护成员和私有成员。而当一个表达式涉及到类保护成员或私有成员时，宏就不能实现了。</p>
<hr>
<h2 id="13-条件编译-ifdef、-else、-endif的作用？"><a href="#13-条件编译-ifdef、-else、-endif的作用？" class="headerlink" title="13.条件编译#ifdef、#else、#endif的作用？"></a>13.条件编译#ifdef、#else、#endif的作用？</h2><p>1.可以通过#define，并通过#ifdef来判断，将某些具体模块包含进要编译的内容；</p>
<p>2.用于子程序前加#define DEBUG用于程序调试；</p>
<p>3.应对硬件的设置（机器类型等）；</p>
<p>4.条件编译功能if也可以实现，但条件编译可以减少被编译语句，从而减少目标程序的大小；</p>
<hr>
<h2 id="14-区分以下几种变量？"><a href="#14-区分以下几种变量？" class="headerlink" title="14.区分以下几种变量？"></a>14.区分以下几种变量？</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">const int a</span><br><span class="line">int const a</span><br><span class="line">const int *a</span><br><span class="line">int *const a</span><br></pre></td></tr></table></figure>
<p>1.int const a 和 const int a均表示常量类型a</p>
<p>2.const int *a，常量指针，其中a是指向const int的变量指针，a的值可以变化</p>
<p>3.int *const a，指针常量，表示a是指向int变量的指针，但a的值不能发生变化。</p>
<hr>
<h2 id="15-volatile有什么作用？"><a href="#15-volatile有什么作用？" class="headerlink" title="15.volatile有什么作用？"></a>15.volatile有什么作用？</h2><p>当对象的值可能在程序的控制或检测之外被改变时，应该将该对象声明为volatile。关键字volatile告诉编译器不应该对这样的对象进行优化。</p>
<hr>
<h2 id="16-什么是常引用？"><a href="#16-什么是常引用？" class="headerlink" title="16.什么是常引用？"></a>16.什么是常引用？</h2><p>1.常引用可以理解为常量指针，形式为const typename&amp; refname=varname;</p>
<p>2.常引用下，原变量值不会被别名所修改；</p>
<p>3.原变量值可以通过原名修改；</p>
<p>4.常引用通常用作只读变量别名或是形参传递。</p>
<hr>
<h2 id="17-区分以下指针类型？"><a href="#17-区分以下指针类型？" class="headerlink" title="17.区分以下指针类型？"></a>17.区分以下指针类型？</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">int *p[10];</span><br><span class="line">int (*p)[10];</span><br><span class="line">int *p(int)</span><br><span class="line">int (*p)(int)</span><br></pre></td></tr></table></figure>
<p>1.int *p[10]表示指针数组，是一个数组变量，大小为10，数组内的元素指向int类型的指针变量；</p>
<p>2.int (*p)[10]表示数组指针，是指针类型，指向的是一个int类型的数组，这个数组的大小是10；</p>
<p>3.int <em>p(int)是函数声明，函数名是p，参数类型是int，返回值是int类型的指针（int </em>）；</p>
<p>4.int (*p)(int)是函数指针，是指针类型，指向的具有int参数，返回值是int的函数。</p>
<hr>
<h2 id="18-a和-amp-a有什么区别？"><a href="#18-a和-amp-a有什么区别？" class="headerlink" title="18.a和&amp;a有什么区别？"></a>18.a和&amp;a有什么区别？</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">假设数组int a[10]</span><br><span class="line">int (*p)[10] = &amp;a</span><br></pre></td></tr></table></figure>
<p>1.a是数组名，是数组首元素的地址，+1表示地址值加上一个int类型的大小，*（a+1）=a[1];</p>
<p>2.&amp;a是数组的地址，其类型为int(*)[10]（就是前面提到的数组指针），其加1时，系统会认为是数组首地址加上整个数组的偏移（10个int型的变量），值为数组a尾元素后一个元素的地址；</p>
<p>3.若（int<em>）p,此时输出 </em>p时，其值为a[0]的值，因为被转为int *类型，解引用时按照int类型大小来读取。</p>
<hr>
<h2 id="19-数组名和指针（这里为指向数组首元素的指针）区别？"><a href="#19-数组名和指针（这里为指向数组首元素的指针）区别？" class="headerlink" title="19.数组名和指针（这里为指向数组首元素的指针）区别？"></a>19.数组名和指针（这里为指向数组首元素的指针）区别？</h2><p>1.二者都可以通过增减偏移量来访问数组中的元素；</p>
<p>2.数组名不是真正意义上的指针，可以理解为指针常量，所以数组名没有自增、自减等操作；</p>
<p>3.当数组名当作形参传递给调用函数后，就失去了原有特性，退化成一般指针，多了自增、自减操作，但sizeof运算符不能再得到原数组的大小了。</p>
<hr>
<h2 id="20-野指针是什么？"><a href="#20-野指针是什么？" class="headerlink" title="20.野指针是什么？"></a>20.野指针是什么？</h2><p>1.野指针也叫空悬指针，不是指向null的指针，而是指向垃圾内存的指针；</p>
<p>2.产生的原因及解决办法：</p>
<p>​    （1）指针变量未及时初始化=&gt;定义指针变量要及时初始化，要么置空；</p>
<p>​    （2）指针free或delete之后没有及时置空=&gt;释放操作后立即置空</p>
<hr>
<h2 id="21-堆和栈的区别？"><a href="#21-堆和栈的区别？" class="headerlink" title="21.堆和栈的区别？"></a>21.堆和栈的区别？</h2><p>1.申请方式不同：</p>
<p>​        （1）栈由系统分配；</p>
<p>​        （2）堆由程序员手动分配；</p>
<p>2.增长方式不同：</p>
<p>​        （1）栈是从高地址向低地址增长；</p>
<p>​        （2）堆是从低地址向高地址增长；</p>
<p>3.大小限制不同：</p>
<p>​        （1）栈顶和栈底是之前预设好的，大小固定，可以通过ulimit -a查看，由ulimit -s修改；</p>
<p>​        （2）堆向高地址扩散，是不连续的内存区域，大小可以灵活调整。</p>
<p>4.申请效率不同：</p>
<p>​        （1）栈由系统分配，速度快，不会有碎片；</p>
<p>​        （2）堆由程序员分配，速度慢，会有碎片。</p>
<hr>
<h2 id="22-delete和-delete-的区别？"><a href="#22-delete和-delete-的区别？" class="headerlink" title="22.delete和 delete[]的区别？"></a>22.delete和 delete[]的区别？</h2><p>1.delete只会调用一次析构函数；</p>
<p>2.delete[]会调用数组中每个元素的析构函数。</p>
<hr>
<h1 id="编译及调试"><a href="#编译及调试" class="headerlink" title="编译及调试"></a>编译及调试</h1><h2 id="1-编译"><a href="#1-编译" class="headerlink" title="1.编译"></a>1.编译</h2><p>​    1.预处理</p>
<p>​            （1）展开所有宏定义；</p>
<p>​            （2）处理条件编译语句，通过是否具有某个宏过滤掉哪些代码；</p>
<p>​            （3）处理#include指令，将被包含的文件插入到该指令所在位置；</p>
<p>​            （4）过滤掉注释语句；</p>
<p>​            （5）添加行号和文件名；</p>
<p>​            （6）保留所有#pargma编译器指令。</p>
<p>​    2.编译</p>
<p>​            （1）词法分析</p>
<p>​            （2）语法分析</p>
<p>​            （3）语义分析</p>
<p>​            （4）中间代码生成</p>
<p>​            （5）目标代码生成与优化</p>
<hr>
<h2 id="2-链接"><a href="#2-链接" class="headerlink" title="2.链接"></a>2.链接</h2><p>各个源代码模块独立的被编译，然后将他们组装起来成为一个整体，组装的过程就是链接。被链接的各个部分本本身就是二进制文件，所以在被链接时需要将所有目标文件的代码段拼接在一起，然后将所有对符号地址的引用加以修正。</p>
<ul>
<li><p>静态链接<br>静态链接最简单的情况就是在编译时和静态库链接在一起成为完整的可执行程序。这里所说的静态库就是对多个目标文件（.o）文件的打包，通常静态链接的包名为lib<em>**</em>.a，静态链接所有被用到的目标文件都会复制到最终生成的可执行目标文件中。这种方式的好处是在运行时，可执行目标文件已经完全装载完毕，只要按指令序执行即可，速度比较快，但缺点也有很多。<br>打包命令：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">gcc -c test1.c</span><br><span class="line">gcc -c test2.c</span><br><span class="line">ar cr libtest.a test1.o test2.o</span><br></pre></td></tr></table></figure>
<p>首先编译得到test1.o和test2.o两个目标文件，之后通过ar命令将这两个文件打包为.a文件，文件名格式为lib + 静态库名 + .a后缀。在生成可执行文件需要使用到它的时候只需要在编译时加上即可。需要注意的是，使用静态库时加在最后的名字不是libtest.a，而是l + 静态库名。</p>
</li>
</ul>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gcc main.c -o main -ltest</span><br></pre></td></tr></table></figure>
<ul>
<li>动态链接<br>静态链接发生于编译阶段，加载至内存前已经完整，但缺点是如果多个程序都需要使用某个静态库，则该静态库会在每个程序中都拷贝一份，非常浪费内存资源，所以出现了动态链接的方式来解决这个问题。</li>
</ul>
<p>动态链接在形式上倒是和静态链接非常相似，首先也是需要打包，打包成动态库，不过文件名格式为lib + 动态库名 + .so后缀。不过动态库的打包不需要使用ar命令，gcc就可以完成，但要注意在编译时要加上-fPIC选项，打包时加上-shared选项。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">gcc -fPIC -c test1.c</span><br><span class="line">gcc -fPIC -c test2.c</span><br><span class="line">gcc -shared test1.o test2.o -o libtest.so</span><br></pre></td></tr></table></figure>
<p>使用动态链接的用法和静态链接相同。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gcc -o main mian.c -ltest</span><br></pre></td></tr></table></figure>
<p>如果仅仅像上面的步骤是没有办法正常使用库的，我们可以通过加-Lpath指定搜索库文件的目录（-L.表示当前目录），默认情况下会到环境变量LD_LIBRARY_PATH指定的目录下搜索库文件，默认情况是/usr/lib，我们可以将库文件拷贝到那个目录下再链接。</p>
<p>静态库和动态库的优缺点：</p>
<ul>
<li>动态库运行时会先检查内存中是否已经有该库的拷贝，若有则共享拷贝，否则重新加载动态库（C语言的标准库就是动态库）。静态库则是每次在编译阶段都将静态库文件打包进去，当某个库被多次引用到时，内存中会有多份副本，浪费资源。</li>
<li>动态库另一个有点就是更新很容易，当库发生变化时，如果接口没变只需要用新的动态库替换掉就可以了。但是如果是静态库的话就需要重新被编译。</li>
<li>不过静态库也有优点，主要就是静态库一次性完成了所有内容的绑定，运行时就不必再去考虑链接的问题了，执行效率会稍微高一些。</li>
</ul>

      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2019/06/28/datastructurehash/" rel="next" title="Hash函数及冲突">
                <i class="fa fa-chevron-left"></i> Hash函数及冲突
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2019/06/30/cpluscplusstatic/" rel="prev" title="C++之静态详解">
                C++之静态详解 <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          

  



        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap">
            Table of Contents
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview-wrap">
            Overview
          </li>
        </ul>
      

      <section class="site-overview-wrap sidebar-panel">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
            
              <p class="site-author-name" itemprop="name">LuQiLin</p>
              <p class="site-description motion-element" itemprop="description"></p>
          </div>

          <nav class="site-state motion-element">

            
              <div class="site-state-item site-state-posts">
              
                <a href="/archives">
              
                  <span class="site-state-item-count">80</span>
                  <span class="site-state-item-name">posts</span>
                </a>
              </div>
            

            
              
              
              <div class="site-state-item site-state-categories">
                
                  <span class="site-state-item-count">1</span>
                  <span class="site-state-item-name">categories</span>
                
              </div>
            

            

          </nav>

          

          

          
          

          
          

          

        </div>
      </section>

      
      <!--noindex-->
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
              
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#基础部分"><span class="nav-number">1.</span> <span class="nav-text">基础部分</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#1-变量声明和定义有什么不同？"><span class="nav-number">1.1.</span> <span class="nav-text">1.变量声明和定义有什么不同？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-零值比较？"><span class="nav-number">1.2.</span> <span class="nav-text">2.零值比较？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#3-strlen和sizeof的区别？"><span class="nav-number">1.3.</span> <span class="nav-text">3.strlen和sizeof的区别？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#4-相同类的同一对象可以相互赋值吗？"><span class="nav-number">1.4.</span> <span class="nav-text">4.相同类的同一对象可以相互赋值吗？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#5-结构体内存对齐问题？"><span class="nav-number">1.5.</span> <span class="nav-text">5.结构体内存对齐问题？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#6-struct和class的区别？"><span class="nav-number">1.6.</span> <span class="nav-text">6.struct和class的区别？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#7-malloc和new的区别？"><span class="nav-number">1.7.</span> <span class="nav-text">7.malloc和new的区别？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#8-指针和引用的区别？"><span class="nav-number">1.8.</span> <span class="nav-text">8.指针和引用的区别？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#9-宏定义和函数的区别？"><span class="nav-number">1.9.</span> <span class="nav-text">9.宏定义和函数的区别？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#10-define和const的区别？"><span class="nav-number">1.10.</span> <span class="nav-text">10.define和const的区别？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#11-宏定义和typedef的区别？"><span class="nav-number">1.11.</span> <span class="nav-text">11.宏定义和typedef的区别？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#12-宏定义和内联函数（inline）的区别？"><span class="nav-number">1.12.</span> <span class="nav-text">12.宏定义和内联函数（inline）的区别？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#13-条件编译-ifdef、-else、-endif的作用？"><span class="nav-number">1.13.</span> <span class="nav-text">13.条件编译#ifdef、#else、#endif的作用？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#14-区分以下几种变量？"><span class="nav-number">1.14.</span> <span class="nav-text">14.区分以下几种变量？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#15-volatile有什么作用？"><span class="nav-number">1.15.</span> <span class="nav-text">15.volatile有什么作用？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#16-什么是常引用？"><span class="nav-number">1.16.</span> <span class="nav-text">16.什么是常引用？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#17-区分以下指针类型？"><span class="nav-number">1.17.</span> <span class="nav-text">17.区分以下指针类型？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#18-a和-amp-a有什么区别？"><span class="nav-number">1.18.</span> <span class="nav-text">18.a和&amp;a有什么区别？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#19-数组名和指针（这里为指向数组首元素的指针）区别？"><span class="nav-number">1.19.</span> <span class="nav-text">19.数组名和指针（这里为指向数组首元素的指针）区别？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#20-野指针是什么？"><span class="nav-number">1.20.</span> <span class="nav-text">20.野指针是什么？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#21-堆和栈的区别？"><span class="nav-number">1.21.</span> <span class="nav-text">21.堆和栈的区别？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#22-delete和-delete-的区别？"><span class="nav-number">1.22.</span> <span class="nav-text">22.delete和 delete[]的区别？</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#编译及调试"><span class="nav-number">2.</span> <span class="nav-text">编译及调试</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#1-编译"><span class="nav-number">2.1.</span> <span class="nav-text">1.编译</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-链接"><span class="nav-number">2.2.</span> <span class="nav-text">2.链接</span></a></li></ol></li></ol></div>
            

          </div>
        </section>
      <!--/noindex-->
      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright">&copy; <span itemprop="copyrightYear">2019</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">LuQiLin</span>

  
</div>


  <div class="powered-by">Powered by <a class="theme-link" target="_blank" href="https://hexo.io">Hexo</a></div>



  <span class="post-meta-divider">|</span>



  <div class="theme-info">Theme &mdash; <a class="theme-link" target="_blank" href="https://github.com/iissnan/hexo-theme-next">NexT.Mist</a> v5.1.4</div>




        







        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  












  
  
    <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>
  

  
  
    <script type="text/javascript" src="/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>
  


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.1.4"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.1.4"></script>



  
  

  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=5.1.4"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=5.1.4"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.1.4"></script>



  


  




	





  





  












  





  

  

  

  
  

  

  

  

</body>
</html>
